package ScalaStudy.chapter06

object Test15_TraitOverLying {
  def main(args: Array[String]): Unit = {


    /////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////   特质叠加 ///////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////

    println("////////////////////////////////////////   覆盖问题   //////////////////////////////////////")

    val student = new Student15
    student.increase()

    println("////////////////////////////////////////   砖石问题   //////////////////////////////////////")
    println("////////////// 将ball的特质进行追加 ///////   追加过程   /////// Color -> Category -> ball ///////////////")
    val myFootBall = new MyFootBall
    println(myFootBall.describe())


  }
}

class Student15 extends Person13 with Talent15 with Knowledge15{
  override def dancing(): Unit = {
    println("student is good at dancing")
  }
  override def singing(): Unit = {
    println("student is good at singing")
  }

  override def increase(): Unit = super.increase()                         //覆盖原则，调用的是最后一个特质的方法，从右到左叠加
//  override def increase(): Unit = super[Person13].increase()             //可以指定，调用的类是什么
}





//定义特质
trait Knowledge15{
  var Score : Int = 0
  def increase(): Unit = {                     //*******两个特质都存在increase方法，会有冲突*************
    println("knowledge increased")
  }
}

trait Talent15{
  def singing():Unit
  def dancing():Unit
  def increase(): Unit = {                      //*******两个特质都存在increase方法，会有冲突*************
    println("talent increased")
  }
}


/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////  砖石问题的叠加 /////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////


//定义球类
trait Ball {
  def describe(): String = "ball"
}

//定义球类颜色
trait colorBall extends Ball{
  val color: String = "red"
  override def describe(): String =color + "-" +  super.describe()
}

//定义球类种类
trait CategoryBall extends Ball{
  var category :String = "foot"
  override def describe(): String =category + "-" +  super.describe()
}

//定义一个球的类
class MyFootBall extends CategoryBall with colorBall{                       // Color -> Category -> ball //
  override def describe(): String ="my ball is a : " + super.describe()
//  override def describe(): String ="my ball is a : " + super[CategoryBall].describe()     //可以指定 super[CategoryBall]
}
